import { isEditMode } from '../global/validate'
import cleargridelement from '../global/cleargridelement'
import { getcellvalue, datagridgrowth, getcellFormula } from '../global/getdata'
import { setcellvalue } from '../global/setdata'
import luckysheetcreatedom from '../global/createdom'
import tooltip from '../global/tooltip'
import formula from '../global/formula'
import { luckysheetrefreshgrid, jfrefreshgrid_rhcw } from '../global/refresh'
import rhchInit from '../global/rhchInit'
import editor from '../global/editor'
import { luckysheetextendtable, luckysheetdeletetable } from '../global/extend'
import { isRealNum } from '../global/validate'
import {
  replaceHtml,
  getObjType,
  chatatABC,
  arrayRemoveItem,
} from '../utils/util'
import { sheetHTML, luckysheetlodingHTML } from './constant'
import server from './server'
import luckysheetConfigsetting from './luckysheetConfigsetting'
import pivotTable from './pivotTable'
import luckysheetsizeauto from './resize'
import luckysheetPostil from './postil'
import imageCtrl from './imageCtrl'
import dataVerificationCtrl from './dataVerificationCtrl'
import hyperlinkCtrl from './hyperlinkCtrl'
import luckysheetFreezen from './freezen'
import { createFilterOptions, labelFilterOptionState } from './filter'
import { selectHightlightShow, selectionCopyShow } from './select'
import Store from '../store'
import locale from '../locale/locale'
import { renderChartShow } from '../expendPlugins/chart/plugin'
import { menuToolBarWidth } from './resize'
import { zoomNumberDomBind } from './zoom'
import menuButton from './menuButton'
import method from '../global/method'
import { setDictData } from '../global/dictRenderData'

const sheetmanage = {
  generateRandomSheetIndex: function(prefix) {
    if (prefix == null) {
      prefix = 'Sheet'
    }

    let userAgent = window.navigator.userAgent
      .replace(/[^a-zA-Z0-9]/g, '')
      .split('')

    let mid = ''

    for (let i = 0; i < 12; i++) {
      mid += userAgent[Math.round(Math.random() * (userAgent.length - 1))]
    }

    let time = new Date().getTime()

    return prefix + '_' + mid + '_' + time
  },
  generateRandomSheetName: function(file, isPivotTable) {
    let index = file.length

    const locale_pivotTable = locale().pivotTable
    const title = locale_pivotTable.title

    for (let i = 0; i < file.length; i++) {
      if (
        file[i].name.indexOf('Sheet') > -1 ||
        file[i].name.indexOf(title) > -1
      ) {
        let suffix = parseFloat(
          file[i].name.replace('Sheet', '').replace(title, '')
        )

        if (suffix != 'NaN' && Math.ceil(suffix) > index) {
          index = Math.ceil(suffix)
        }
      }
    }

    if (isPivotTable) {
      return title + (index + 1)
    } else {
      return 'Sheet' + (index + 1)
    }
  },
  generateCopySheetName: function(file, name) {
    let copySheetName = ''

    let _locale = locale()
    let locale_info = _locale.info

    if (name.toString().indexOf('(' + locale_info.copy) > -1) {
      let copy_i = name.toString().indexOf('(' + locale_info.copy)
      let name2 = name.toString().substring(0, copy_i) + '(' + locale_info.copy
      let index = null

      for (let i = 0; i < file.length; i++) {
        let fileName = file[i].name.toString()
        let st_i = fileName.indexOf(name2)

        if (st_i > -1) {
          let ed_i = fileName.indexOf(')', st_i + name2.length)
          let num = fileName.substring(st_i + name2.length, ed_i)

          if (isRealNum(num)) {
            if (index == null || parseInt(num) > index) {
              index = parseInt(num)
            }
          }
        }
      }

      if (index == null) {
        copySheetName = name2 + '2)'
      } else {
        index++
        copySheetName = name2 + index + ')'
      }
    } else {
      let index = null
      let hascopy = false
      let name2 = name + '(' + locale_info.copy

      for (let i = 0; i < file.length; i++) {
        let fileName = file[i].name.toString()
        let st_i = fileName.indexOf(name2)

        if (st_i > -1) {
          hascopy = true
          let ed_i = fileName.indexOf(')', st_i + name2.length)
          let num = fileName.substring(st_i + name2.length, ed_i)

          if (isRealNum(num)) {
            if (index == null || parseInt(num) > index) {
              index = parseInt(num)
            }
          }
        }
      }

      if (hascopy) {
        if (index == null) {
          copySheetName = name + '(' + locale_info.copy + '2)'
        } else {
          index++
          copySheetName = name + '(' + locale_info.copy + '' + index + ')'
        }
      } else {
        copySheetName = name + '(' + locale_info.copy + ')'
      }
    }

    return copySheetName
  },
  getSheetByIndex: function(index) {
    let _this = this

    if (index == null) {
      index = Store.currentSheetIndex
    }

    let i = _this.getSheetIndex(index)

    return Store.luckysheetfile[i]
  },
  getSheetByName: function(name) {
    let _this = this

    if (name == null) {
      return null
    }

    for (let i = 0; i < Store.luckysheetfile.length; i++) {
      let file = Store.luckysheetfile[i]
      if (file.name == name) {
        return file
      }
    }

    return null
  },
  getCurSheetnoset: function() {
    let curindex = 0

    for (let i = 0; i < Store.luckysheetfile.length; i++) {
      if (Store.luckysheetfile[i].status == 1) {
        curindex = Store.luckysheetfile[i].index
        break
      }
    }

    return curindex
  },
  getCurSheet: function() {
    if (Store.luckysheetfile.length) {
      let hasActive = false,
        indexs = []
      Store.luckysheetfile.forEach((item) => {
        if ('undefined' === typeof item.index) {
          item.index = this.generateRandomSheetIndex()
        }
        if (indexs.includes(item.index)) {
          item.index = this.generateRandomSheetIndex()
        } else {
          indexs.push(item.index)
        }

        if ('undefined' === typeof item.status) {
          item.status = 0
        }
        if (item.status == 1) {
          if (hasActive) {
            item.status = 0
          } else {
            hasActive = true
          }
        }
      })
      if (!hasActive) {
        Store.luckysheetfile[0].status = 1
      }
    }
    Store.currentSheetIndex = Store.luckysheetfile[0].index

    for (let i = 0; i < Store.luckysheetfile.length; i++) {
      if (Store.luckysheetfile[i].status == 1) {
        Store.currentSheetIndex = Store.luckysheetfile[i].index
        break
      }
    }

    return Store.currentSheetIndex
  },
  addNewSheet: function(e, isPivotTable) {
    if (isEditMode() || Store.allowEdit === false) {
      // alert("非编辑模式下不允许该操作！");
      return
    }
    // 钩子 sheetCreateBefore
    if (!method.createHookFunction('sheetCreateBefore')) {
      return
    }

    let _this = this

    let order = Store.luckysheetfile.length
    let index = _this.generateRandomSheetIndex()

    let sheetname = _this.generateRandomSheetName(
      Store.luckysheetfile,
      isPivotTable
    )

    $('#luckysheet-sheet-container-c').append(
      replaceHtml(sheetHTML, {
        index: index,
        active: '',
        name: sheetname,
        style: '',
        colorset: '',
      })
    )

    let sheetconfig = {
      name: sheetname,
      color: '',
      status: '0',
      order: order,
      index: index,
      celldata: [],
      row: Store.defaultrowNum,
      column: Store.defaultcolumnNum,
      config: {},
      pivotTable: null,
      isPivotTable: !!isPivotTable,
    }
    Store.luckysheetfile.push(sheetconfig)

    $('#luckysheet-sheet-area div.luckysheet-sheets-item').removeClass(
      'luckysheet-sheets-item-active'
    )
    $('#luckysheet-sheets-item' + index).addClass(
      'luckysheet-sheets-item-active'
    )
    $('#luckysheet-cell-main').append(
      '<div id="luckysheet-datavisual-selection-set-' +
        index +
        '" class="luckysheet-datavisual-selection-set"></div>'
    )
    cleargridelement(e)

    server.saveParam('sha', null, $.extend(true, {}, sheetconfig))

    if (Store.clearjfundo) {
      Store.jfundo.length = 0
      let redo = {}
      redo['type'] = 'addSheet'
      redo['sheetconfig'] = $.extend(true, {}, sheetconfig)
      redo['index'] = index
      redo['currentSheetIndex'] = Store.currentSheetIndex
      Store.jfredo.push(redo)
    }

    _this.changeSheetExec(index, isPivotTable, true)

    // 钩子 sheetCreateAfter 不应该在这里 应在绘制完成后 因此在 changeSheet 实现
  },
  setSheetHide: function(index, isDelete) {
    let _this = this
    let currentIdx = _this.getSheetIndex(index)
    // 钩子 sheetHideBefore
    if (
      !isDelete &&
      !method.createHookFunction('sheetHideBefore', {
        sheet: Store.luckysheetfile[currentIdx],
      })
    ) {
      return
    }
    Store.luckysheetfile[currentIdx].hide = 1

    let luckysheetcurrentSheetitem = $('#luckysheet-sheets-item' + index)
    luckysheetcurrentSheetitem.hide()

    $('#luckysheet-sheet-area div.luckysheet-sheets-item').removeClass(
      'luckysheet-sheets-item-active'
    )

    let indicator
    if (luckysheetConfigsetting.showsheetbarConfig.sheet) {
      indicator = luckysheetcurrentSheetitem.nextAll(':visible')
      if (luckysheetcurrentSheetitem.nextAll(':visible').length > 0) {
        indicator = indicator.eq(0).data('index')
      } else {
        indicator = luckysheetcurrentSheetitem
          .prevAll(':visible')
          .eq(0)
          .data('index')
      }
    } else {
      let nextActiveIdx,
        showSheetIdxs = []
      Store.luckysheetfile.forEach((ele, index) => {
        if (1 !== ele.hide) showSheetIdxs.push(index)
      })
      let len = showSheetIdxs.length
      if (1 === len) {
        nextActiveIdx = showSheetIdxs[0]
      } else {
        nextActiveIdx =
          showSheetIdxs[len - 1] > currentIdx
            ? showSheetIdxs.find((e) => e > currentIdx)
            : showSheetIdxs[len - 1]
      }

      indicator = Store.luckysheetfile[nextActiveIdx].index
    }

    $('#luckysheet-sheets-item' + indicator).addClass(
      'luckysheet-sheets-item-active'
    )

    _this.changeSheetExec(indicator)
    _this.locationSheet()

    server.saveParam('sh', luckysheetcurrentSheetitem.data('index'), 1, {
      op: 'hide',
      cur: indicator,
    })
    // 钩子 sheetHideAfter
    if (!isDelete) {
      method.createHookFunction('sheetHideAfter', {
        sheet: Store.luckysheetfile[currentIdx],
      })
    }
  },
  setSheetShow: function(index) {
    let _this = this
    const file = Store.luckysheetfile[_this.getSheetIndex(index)]
    // 钩子 sheetShowBefore
    if (!method.createHookFunction('sheetShowBefore', { sheet: file })) {
      return
    }
    file.hide = 0
    _this.changeSheetExec(index)

    server.saveParam('sh', index, 0, { op: 'show', cur: null })
    // 钩子 sheetShowAfter
    method.createHookFunction('sheetShowAfter', { sheet: file })
  },
  sheetMaxIndex: 0,
  ordersheet: function(property) {
    return function(a, b) {
      let value1 = a[property]
      let value2 = b[property]
      return value1 - value2
    }
  },
  getCurrentOrder: function() {
    let orders = {}

    $('#luckysheet-sheet-area div.luckysheet-sheets-item').each(function(a) {
      let index = $(this).data('index')

      for (let i = 0; i < Store.luckysheetfile.length; i++) {
        if (Store.luckysheetfile[i].index == index) {
          orders[index.toString()] = a
          break
        }
      }
    })

    return orders
  },
  reOrderAllSheet: function() {
    let orders = {}

    $('#luckysheet-sheet-area div.luckysheet-sheets-item').each(function(a) {
      let index = $(this).data('index')

      for (let i = 0; i < Store.luckysheetfile.length; i++) {
        if (Store.luckysheetfile[i].index == index) {
          Store.luckysheetfile[i].order = a
          orders[index.toString()] = a
          break
        }
      }
    })

    server.saveParam('shr', null, orders)

    Store.luckysheetfile.sort((x, y) => {
      let order_x = x.order
      let order_y = y.order

      if (order_x != null && order_y != null) {
        return order_x - order_y
      } else if (order_x != null) {
        return -1
      } else if (order_y != null) {
        return 1
      } else {
        return 1
      }
    })
  },
  createSheet: function() {
    //修复拖动sheet更新后台后，重新打开显示错误
    let _this = this

    let btn = []
    Store.luckysheetfile.sort(_this.ordersheet('order'))

    for (let i = 0; i < Store.luckysheetfile.length; i++) {
      let display = ''
      let sheetIndex = Store.luckysheetfile[i].index

      let colorset = ''
      if (Store.luckysheetfile[i].color != null) {
        colorset =
          '<div class="luckysheet-sheets-item-color" style=" position: absolute; width: 100%; height: 3px; bottom: 0px; left: 0px; background-color: ' +
          Store.luckysheetfile[i].color +
          ';"></div>'
      }

      if (Store.currentSheetIndex == sheetIndex) {
        //使用Store.luckysheetfile中的index比较，而不是order
        btn.push(
          replaceHtml(sheetHTML, {
            index: sheetIndex,
            active: 'luckysheet-sheets-item-active',
            name: Store.luckysheetfile[i].name,
            style: '',
            colorset: colorset,
          })
        )
      } else {
        if (Store.luckysheetfile[i].hide == 1) {
          btn.push(
            replaceHtml(sheetHTML, {
              index: sheetIndex,
              active: '',
              name: Store.luckysheetfile[i].name,
              style: 'display:none;',
              colorset: colorset,
            })
          )
        } else {
          btn.push(
            replaceHtml(sheetHTML, {
              index: sheetIndex,
              active: '',
              name: Store.luckysheetfile[i].name,
              style: '',
              colorset: colorset,
            })
          )
        }
        display = "style='display:none;'"
      }
      //Store.luckysheetfile[i].index = i; //index即为默认
      // if(sheetIndex > this.sheetMaxIndex){
      //     this.sheetMaxIndex = sheetIndex;
      // }

      $('#luckysheet-cell-main').append(
        '<div ' +
          display +
          ' id="luckysheet-datavisual-selection-set-' +
          sheetIndex +
          '" class="luckysheet-datavisual-selection-set"></div>'
      )
    }

    $('#luckysheet-sheet-container-c').append(btn.join(''))

    _this.locationSheet()
  },
  // *控制sheet栏的左右滚动按钮是否显示
  locationSheet: function() {
    let $c = $('#luckysheet-sheet-container-c'),
      winW = $('#' + Store.container).width()
    let $cursheet = $(
      '#luckysheet-sheet-container-c > div.luckysheet-sheets-item-active'
    ).eq(0)

    let scrollLeftpx = 0
    let c_width = 0

    $(
      '#luckysheet-sheet-container-c > div.luckysheet-sheets-item:visible'
    ).each(function() {
      if ($(this).hasClass('luckysheet-sheets-item-active')) {
        scrollLeftpx = c_width
      }
      c_width += $(this).outerWidth()
    })

    setTimeout(function() {
      $c.scrollLeft(scrollLeftpx - 10)

      if (luckysheetConfigsetting.showsheetbarConfig.sheet) {
        if (c_width >= winW * 0.7) {
          $('#luckysheet-sheet-area .luckysheet-sheets-scroll').css(
            'display',
            'inline-block'
          )
          $('#luckysheet-sheet-container .docs-sheet-fade-left').show()
        } else {
          $('#luckysheet-sheet-area .luckysheet-sheets-scroll').css(
            'display',
            'none'
          )
          $('#luckysheet-sheet-container .docs-sheet-fade-left').hide()
        }
      }
    }, 1)
  },
  copySheet: function(copyindex, e) {
    if (isEditMode() || Store.allowEdit === false) {
      // alert("非编辑模式下不允许该操作！");
      return
    }

    let _this = this

    let order = Store.luckysheetfile.length
    let index = _this.generateRandomSheetIndex()

    let copyarrindex = _this.getSheetIndex(copyindex)
    let copyjson = $.extend(true, {}, Store.luckysheetfile[copyarrindex])
    copyjson.order = order
    copyjson.index = index
    copyjson.name = _this.generateCopySheetName(
      Store.luckysheetfile,
      copyjson.name
    )

    // 钩子 sheetCreateBefore
    if (
      !method.createHookFunction('sheetCopyBefore', {
        targetSheet: Store.luckysheetfile[copyarrindex],
        copySheet: copyjson,
      })
    ) {
      return
    }

    let colorset = ''
    if (copyjson.color != null) {
      colorset =
        '<div class="luckysheet-sheets-item-color" style=" position: absolute; width: 100%; height: 3px; bottom: 0px; left: 0px; background-color: ' +
        copyjson.color +
        ';"></div>'
    }

    let copyobject = $('#luckysheet-sheets-item' + copyindex)
    $('#luckysheet-sheet-container-c').append(
      replaceHtml(sheetHTML, {
        index: copyjson.index,
        active: '',
        name: copyjson.name,
        order: copyjson.order,
        style: '',
        colorset: colorset,
      })
    )
    $('#luckysheet-sheets-item' + copyjson.index).insertAfter(copyobject)
    Store.luckysheetfile.splice(copyarrindex + 1, 0, copyjson)

    $('#luckysheet-sheet-area div.luckysheet-sheets-item').removeClass(
      'luckysheet-sheets-item-active'
    )
    $('#luckysheet-sheets-item' + index).addClass(
      'luckysheet-sheets-item-active'
    )
    $('#luckysheet-cell-main').append(
      '<div id="luckysheet-datavisual-selection-set-' +
        index +
        '" class="luckysheet-datavisual-selection-set"></div>'
    )
    cleargridelement(e)

    server.saveParam('shc', index, {
      copyindex: copyindex,
      name: copyjson.name,
    })

    _this.changeSheetExec(index, undefined, undefined, true)
    _this.reOrderAllSheet()

    if (Store.clearjfundo) {
      Store.jfredo.push({
        type: 'copySheet',
        copyindex: copyindex,
        index: copyjson.index,
        sheetIndex: copyjson.index,
      })
    } else if (Store.jfredo.length > 0) {
      let jfredostr = Store.jfredo[Store.jfredo.length - 1]

      if (jfredostr.type == 'copySheet') {
        jfredostr.index = copyjson.index
        jfredostr.sheetIndex = copyjson.index
      }
    }
  },
  hasSheet: function(index) {
    if (index == null) {
      return false
    }

    index = this.getSheetIndex(index)

    if (index == null) {
      return false
    } else {
      return true
    }
  },
  createSheetbydata: function(data, isrenew, isBefore = true) {
    let _this = this

    let colorset = ''
    if (data.color != null) {
      colorset =
        '<div class="luckysheet-sheets-item-color" style=" position: absolute; width: 100%; height: 3px; bottom: 0px; left: 0px; background-color: ' +
        data.color +
        ';"></div>'
    }

    $('#luckysheet-sheet-container-c').append(
      replaceHtml(sheetHTML, {
        index: data.index,
        active: '',
        name: data.name,
        order: data.order,
        style: '',
        colorset: colorset,
      })
    )

    if (isBefore) {
      let previndex = data.order
      if (previndex >= Store.luckysheetfile.length) {
        previndex = Store.luckysheetfile.length - 1
        $('#luckysheet-sheets-item' + data.index).insertAfter(
          $('#luckysheet-sheets-item' + Store.luckysheetfile[previndex].index)
        )
      } else {
        $('#luckysheet-sheets-item' + data.index).insertBefore(
          $('#luckysheet-sheets-item' + Store.luckysheetfile[previndex].index)
        )
      }
    }

    Store.luckysheetfile.push(data)

    $('#luckysheet-sheet-area div.luckysheet-sheets-item').removeClass(
      'luckysheet-sheets-item-active'
    )
    $('#luckysheet-sheets-item' + data.index).addClass(
      'luckysheet-sheets-item-active'
    )
    $('#luckysheet-cell-main').append(
      '<div id="luckysheet-datavisual-selection-set-' +
        data.index +
        '" class="luckysheet-datavisual-selection-set"></div>'
    )
    cleargridelement()

    if (isrenew != null) {
      server.saveParam('shre', null, { reIndex: data.index })
      data.hide = 0
      server.saveParam('sh', data.index, 0, { op: 'show', cur: null })
    } else {
      server.saveParam('sha', null, data)
    }

    _this.changeSheetExec(data.index, data.isPivotTable, true)
    _this.reOrderAllSheet()
  },
  deleteSheet: function(index) {
    let _this = this
    if (Store.allowEdit === false) {
      return
    }
    let arrIndex = _this.getSheetIndex(index)
    const file = Store.luckysheetfile[arrIndex]
    // 钩子 sheetDeleteBefore
    if (!method.createHookFunction('sheetDeleteBefore', { sheet: file })) {
      return
    }
    _this.setSheetHide(index, true)
    $('#luckysheet-sheets-item' + index).remove()
    $('#luckysheet-datavisual-selection-set-' + index).remove()

    let removedsheet = Store.luckysheetfile.splice(arrIndex, 1)
    _this.reOrderAllSheet()

    server.saveParam('shd', null, { deleIndex: index })

    if (Store.clearjfundo) {
      removedsheet[0].type = 'deleteSheet'
      Store.jfredo.push(removedsheet[0])
    }
    // 钩子 sheetDeleteAfter
    method.createHookFunction('sheetDeleteAfter', { sheet: file })
  },
  nulldata: null,
  getGridData: function(d) {
    let ret = []
    for (let r = 0; r < d.length; r++) {
      for (let c = 0; c < d[0].length; c++) {
        if (d[r][c] == null) {
          continue
        }
        ret.push({ r: r, c: c, v: d[r][c] })
      }
    }
    return ret
  },
  buildGridData: function(file) {
    // 如果已经存在二维数据data,那么直接返回data；如果只有celldata，那么就转化成二维数组data，再返回
    let row = file.row == null ? Store.defaultrowNum : file.row,
      column = file.column == null ? Store.defaultcolumnNum : file.column,
      data =
        file.data && file.data.length > 0
          ? file.data
          : datagridgrowth([], row, column),
      celldata = file.celldata
    if (file.data && file.data.length > 0) {
      for (let i = data.length - 1; i >= 0; i--) {
        const l = data[0].length
        for (let j = 0; j < l; j++) {
          setcellvalue(i, j, data, data[i][j])
        }
      }
    } else {
      if (!celldata && data.length) {
        for (let i = data.length - 1; i >= 0; i--) {
          const l = data[0].length
          for (let j = 0; j < l; j++) {
            setcellvalue(i, j, data, data[i][j])
          }
        }
      } else {
        for (let i = celldata.length - 1; i >= 0; i--) {
          const item = celldata[i]
          const r = item.r
          const c = item.c
          const v = item.v
          if (r >= data.length) {
            data = datagridgrowth(data, r - data.length + 1, 0)
          }
          if (c >= data[0].length) {
            data = datagridgrowth(data, 0, c - data[0].length + 1)
          }
          setcellvalue(r, c, data, v)
        }
      }
    }

    if (file.dbMark && Store.compType === 'design') {
      for (let item in file.dbMark) {
        const a = item.split('_')
        setcellvalue(a[0], a[1], data, file.dbMark[item])
      }
    }
    //亿万格式+精确度 恢复全局初始化
    luckysheetConfigsetting.autoFormatw = false
    luckysheetConfigsetting.accuracy = undefined
    return data
  },
  /**
   * Json转化为luckysheet所需的数据格式，用于展示
   * @param {Object} options  容器及基础配置
   * @param {Object} file table设计的JSON对象数据
   * @param {Array} datas 初始化时需要显示的数据
   */
  setCellDataByJson: function(OB, datas = [], rateV, op) {
    let file = JSON.parse(JSON.stringify(OB))
    let options = op || Store.toJsonOptions
    if (file.dbMark) {
      let dbMark = {};
      Object.keys(file.dbMark)
     .sort((a, b) => Number(a.split('_')[1])-Number(b.split('_')[1]))
     .forEach((item) => (dbMark[item] = file.dbMark[item]))
      // let dbMark = file.dbMark
      if (options.compType === 'filling' && file.dictCodesData) {
        Object.keys(file.dictCodesData).forEach((item) => {
          setDictData(item, file.dictCodesData[item])
        })
      }
      let start_r = 0,
        end_c = 0,
        colDbKey = []
      for (let item in dbMark) {
        start_r = dbMark[item].r > start_r ? dbMark[item].r : start_r
        end_c = dbMark[item].c > end_c ? dbMark[item].c : end_c
        colDbKey.push(dbMark[item].v)
      }
      const res = []
      for (let i = 0; i < datas.length; i++) {
        const activeI = datas[i]
        const r = i + start_r
        for (let j = 0; j <= end_c; j++) {
          let cf = {}
          const key = colDbKey[j]
          const v = activeI[key]
          let m = ''
          if (file.dictRenderData&&file.dictRenderData[j] && file.dictCodesData) {
            const t = file.dictRenderData[j].value1
            const c = file.dictRenderData[j].value2
            const dictRender = file.dictCodesData[t]
            if (dictRender && dictRender[c]) {
              const a = dictRender[c].filter((i) => i.itemCode === v)[0]
              m = a ? a.itemName : v
            } else {
              m = v
            }
          } else if (
            file.dictRenderData&&file.dictRenderData[`${r}_${j}`] &&
            file.dictRenderData[`${r}_${j}`].type3 === 'dictRender'
          ) {
            const t = file.dictRenderData[`${r}_${j}`].value1
            const c = file.dictRenderData[`${r}_${j}`].value2
            if (dictRender[t][c]) {
              const a = dictRender[t][c].filter((i) => i.itemCode === v)[0]
              m = a ? a.itemName : v
            } else {
              m = v
            }
          } else {
            m = v
          }
          if (j === 0) {
            const ID_KEY = key.split('.')[0]
            cf = {
              ID: activeI[`${ID_KEY}.ID`],
              change: false,
            }
          }
          res.push({ r: r, c: j, v: { m: m, v: m, cf: cf } })
        }
      }
      file.rateValue = rateV
      file.celldata = file.celldata.concat(res)
      file.data = []
      if (options.data) {
        options.data[0] = file
      } else {
        options.data = [file]
      }

      window.luckysheet.create(options)
    } else {
      if (options) options.data[0] = file
      else options = [[file]]
      window.luckysheet.create(options)
    }
  },
  dataToObArr: function(file) {
    let res = []
    // 如果已经存在二维数据data,那么直接返回data；如果只有celldata，那么就转化成二维数组data，再返回
    let row = file.row == null ? Store.defaultrowNum : file.row,
      column = file.column == null ? Store.defaultcolumnNum : file.column,
      data =
        file.data && file.data.length > 0
          ? file.data
          : datagridgrowth([], row, column),
      celldata = file.celldata
    if (file.data && file.data.length > 0) {
      for (let i = 0; i < data.length; i++) {
        for (let j = 0; j < data[0].length; j++) {
          if (data[i][j].dataMark) {
            let keys = []
            if (
              data[i][j].dataMark.type === 'DBFiled' &&
              !data[i][j].dataMark.isList
            ) {
              let ob = new Object()
              ob[data[i][j].active] = data[i][j].v
              res.push(ob)
            } else if (
              data[i][j].dataMark.type === 'DBFiled' &&
              data[i][j].dataMark.isList
            ) {
              let ob = new Object()
              ob[`${i}_${j}`] = data[i][j].active
              keys.push({})
            }
          }
        }
      }
    } else {
      if (celldata && celldata.length > 0) {
        for (let i = 0; i < celldata.length; i++) {
          let item = celldata[i]
          let r = item.r
          let c = item.c
          let v = item.v

          if (r >= data.length) {
            data = datagridgrowth(data, r - data.length + 1, 0)
          }
          if (c >= data[0].length) {
            data = datagridgrowth(data, 0, c - data[0].length + 1)
          }
          setcellvalue(r, c, data, v)
        }
      }
    }
    //亿万格式+精确度 恢复全局初始化
    luckysheetConfigsetting.autoFormatw = false
    luckysheetConfigsetting.accuracy = undefined
    return data
  },
  cutGridData: function(d) {
    let rowindex = 0

    for (let r = d.length - 1; r >= 0; r--) {
      let isnull = true

      for (let c = 0; c < d[0].length; c++) {
        let value = getcellvalue(r, c)

        if (value != null && $.trim(value).length > 0) {
          isnull = false
          break
        }
      }
      if (!isnull) {
        break
      } else {
        rowindex = r
      }
    }

    return d.slice(0, rowindex)
  },
  addGridData: function(celldata, row, column) {
    let data = datagridgrowth([], row, column)

    if (celldata != null) {
      for (let i = 0; i < celldata.length; i++) {
        let item = celldata[i]
        let r = item.r
        let c = item.c
        let v = item.v

        if (r >= data.length) {
          data = datagridgrowth(data, r - data.length + 1, 0)
        }

        if (c >= data[0].length) {
          data = datagridgrowth(data, 0, c - data[0].length + 1)
        }
        setcellvalue(r, c, data, v)
      }
    }

    return data
  },
  sheetParamRestore: function(file, data) {
    Store.luckysheet_select_save = file['luckysheet_select_save']
    if (
      Store.luckysheet_select_save == null ||
      Store.luckysheet_select_save.length == 0
    ) {
      if (data[0] != null && data[0][0] != null && data[0][0].mc != null) {
        Store.luckysheet_select_save = [
          {
            row: [0, data[0][0].mc.rs - 1],
            column: [0, data[0][0].mc.cs - 1],
          },
        ]
      } else {
        Store.luckysheet_select_save = [
          {
            row: [0, 0],
            column: [0, 0],
          },
        ]
      }
    }

    Store.luckysheet_selection_range =
      file['luckysheet_selection_range'] == null
        ? []
        : file['luckysheet_selection_range']
    Store.config = file['config'] == null ? {} : file['config']

    Store.zoomRatio = file['zoomRatio'] == null ? 1 : file['zoomRatio']

    if (file['defaultRowHeight'] != null) {
      Store.defaultrowlen = parseFloat(file['defaultRowHeight'])
    } else {
      Store.defaultrowlen = luckysheetConfigsetting['defaultRowHeight']
    }

    if (file['defaultColWidth'] != null) {
      Store.defaultcollen = parseFloat(file['defaultColWidth'])
    } else {
      Store.defaultcollen = luckysheetConfigsetting['defaultColWidth']
    }

    if (file['showGridLines'] != null) {
      let showGridLines = file['showGridLines']
      if (showGridLines == 0 || showGridLines == false) {
        Store.showGridLines = false
      } else {
        Store.showGridLines = true
      }
    } else {
      Store.showGridLines = true
    }
  },
  initialjfFile: function(menu, title) {
    let _this = this
    _this.getCurSheet()
    let file =
      Store.luckysheetfile[_this.getSheetIndex(Store.currentSheetIndex)]
    _this.nulldata = datagridgrowth(
      [],
      Store.defaultrowNum,
      Store.defaultcolumnNum
    )
    let data = _this.buildGridData(file)
    //初始化的时候 记录选区
    let select_save = []
    file.jfgird_select_save = file.jfgird_select_save || []
    file.jfgird_select_save.forEach((item) =>
      select_save.push({ row: item.row, column: item.column })
    )
    file.luckysheet_select_save = select_save
    this.sheetParamRestore(file, data)

    let r2 = Store.luckysheet_select_save[0].row[1],
      c2 = Store.luckysheet_select_save[0].column[1]

    if (Store.luckysheet_select_save.length > 1) {
      for (let i = 0; i < Store.luckysheet_select_save.length; i++) {
        if (Store.luckysheet_select_save[i].row[1] > r2) {
          r2 = Store.luckysheet_select_save[i].row[1]
        }

        if (Store.luckysheet_select_save[i].column[1] > c2) {
          c2 = Store.luckysheet_select_save[i].column[1]
        }
      }
    }
    menuButton.fontInitial(Store.fontList) //initial font

    file.data = data

    let rowheight = data.length
    if (r2 > rowheight - 1) {
      rowheight = r2 + 1
    }

    let colwidth = data[0].length
    if (c2 > colwidth - 1) {
      colwidth = c2 + 1
    }

    //钩子函数 表格创建之前触发
    if (typeof luckysheetConfigsetting.beforeCreateDom == 'function') {
      luckysheetConfigsetting.beforeCreateDom(luckysheet)
    }

    if (typeof luckysheetConfigsetting.workbookCreateBefore == 'function') {
      luckysheetConfigsetting.workbookCreateBefore(luckysheet)
    }

    // Store.flowdata = data;
    luckysheetcreatedom(
      colwidth,
      rowheight,
      data,
      menu,
      title,
      file.fillingRate,
      file.rateValue
    )

    setTimeout(function() {
      tooltip.createHoverTip(
        '#luckysheet_info_detail',
        '.luckysheet_info_detail_back, .luckysheet_info_detail_input, .luckysheet_info_detail_update'
      )
      tooltip.createHoverTip(
        '#luckysheet-wa-editor',
        '.luckysheet-toolbar-menu-button, .luckysheet-toolbar-button, .luckysheet-toolbar-combo-button'
      )

      Store.luckysheetTableContentHW = [
        $('#luckysheet-cell-main').width() +
          Store.rowHeaderWidth -
          Store.cellMainSrollBarSize,
        $('#luckysheet-cell-main').height() +
          Store.columnHeaderHeight -
          Store.cellMainSrollBarSize,
      ]
      $('#luckysheetTableContent, #luckysheetTableContentF')
        .attr({
          width: Math.ceil(
            Store.luckysheetTableContentHW[0] * Store.devicePixelRatio
          ),
          height: Math.ceil(
            Store.luckysheetTableContentHW[1] * Store.devicePixelRatio
          ),
        })
        .css({
          width: Store.luckysheetTableContentHW[0],
          height: Store.luckysheetTableContentHW[1],
        })
        .get(0)
        .getContext('2d')
      let locale_info = locale().info
      let key = server.gridKey
      let cahce_key = key + '__qkcache'

      let ini = function() {
        file['load'] = '1'
        _this.createSheet()
        let execF = function() {
          _this.mergeCalculation(file['index'])
          _this.setSheetParam(false)
          // editor.webWorkerFlowDataCache(Store.flowdata);//worker存数据
          _this.storeSheetParam()
          _this.restoreselect()
          _this.CacheNotLoadControll = []
          _this.restoreCache()
          formula.execFunctionGroupForce(
            luckysheetConfigsetting.forceCalculation
          )
          _this.restoreSheetAll(Store.currentSheetIndex)

          // luckysheetrefreshgrid(0, 0);
          $('#luckysheet_info_detail_save').html(locale_info.detailSave)

          if (!!file.isPivotTable) {
            Store.luckysheetcurrentisPivotTable = true
            // pivotTable.changePivotTable(Store.currentSheetIndex); //此方法需要注释掉，在restoreSheetAll中已经执行了刷新了数据透视表，这里就不需要了
          } else {
            Store.luckysheetcurrentisPivotTable = false
            $('#luckysheet-modal-dialog-slider-pivot').hide()
          }

          // Store toolbar button width value
          menuToolBarWidth()

          luckysheetsizeauto()

          //等待滚动条dom宽高加载完成后 初始化滚动位置
          if (file['scrollLeft'] != null && file['scrollLeft'] > 0) {
            $('#luckysheet-scrollbar-x').scrollLeft(file['scrollLeft'])
          } else {
            $('#luckysheet-scrollbar-x').scrollLeft(0)
          }

          if (file['scrollTop'] != null && file['scrollTop'] > 0) {
            $('#luckysheet-scrollbar-y').scrollTop(file['scrollTop'])
          } else {
            $('#luckysheet-scrollbar-y').scrollTop(0)
          }

          // 此处已经渲染完成表格，应该挪到前面
          // //钩子函数 表格创建之前触发
          // if(typeof luckysheetConfigsetting.beforeCreateDom == "function" ){
          //     luckysheetConfigsetting.beforeCreateDom(luckysheet);
          // }

          // if(typeof luckysheetConfigsetting.workbookCreateBefore == "function"){
          //     luckysheetConfigsetting.workbookCreateBefore(luckysheet);
          // }

          arrayRemoveItem(Store.asyncLoad, 'core')

          if (luckysheetConfigsetting.pointEdit) {
            setTimeout(function() {
              Store.loadingObj.close()
            }, 0)
          } else {
            setTimeout(function() {
              Store.loadingObj.close()
            }, 500)
          }
        }

        let loadSheetUrl = server.loadSheetUrl

        if (loadSheetUrl == '') {
          //     execF();
          // }
          // else if(sheetindex.length>0 && loadSheetUrl == ""){
          // for(let i = 0;i<Store.luckysheetfile.length;i++){
          //     let otherfile = Store.luckysheetfile[i];
          //     if(otherfile.index == file.index){
          //         continue;
          //     }
          //     // let otherfile = Store.luckysheetfile[_this.getSheetIndex(item)];
          //     if(otherfile["load"] == null || otherfile["load"] == "0"){
          //         otherfile["data"] = _this.buildGridData(otherfile);
          //         otherfile["load"] = "1";
          //     }
          // }

          _this.loadOtherFile(file)
          execF()
        } else {
          let sheetindexset = _this.checkLoadSheetIndex(file)
          let sheetindex = []

          for (let i = 0; i < sheetindexset.length; i++) {
            let item = sheetindexset[i]

            if (item == file['index']) {
              continue
            }

            sheetindex.push(item)
          }

          // No request is sent if it is not linked to other worksheets
          if (sheetindex.length === 0) {
            execF()
            return
          }
          $.post(
            loadSheetUrl,
            { gridKey: server.gridKey, index: sheetindex.join(',') },
            function(d) {
              let dataset = new Function('return ' + d)()

              for (let item in dataset) {
                if (item == file['index']) {
                  continue
                }

                let otherfile = Store.luckysheetfile[_this.getSheetIndex(item)]

                if (otherfile['load'] == null || otherfile['load'] == '0') {
                  otherfile.celldata = dataset[item.toString()]

                  otherfile['data'] = _this.buildGridData(otherfile)
                  otherfile['load'] = '1'
                }
              }

              execF()
            }
          )
        }
      }

      try {
        localforage.getItem(cahce_key).then(function(readValue) {
          if (readValue != null) {
            _this.CacheNotLoadControll = readValue
          }
          server.clearcachelocaldata(function() {
            ini()
          })
        })
      } catch (e) {
        ini()
      }
    }, 1)
  },
  storeSheetParam: function() {
    let index = this.getSheetIndex(Store.currentSheetIndex)
    let file = Store.luckysheetfile[index]
    file['config'] = Store.config
    file['visibledatarow'] = Store.visibledatarow
    file['visibledatacolumn'] = Store.visibledatacolumn
    file['ch_width'] = Store.ch_width
    file['rh_height'] = Store.rh_height
    file['luckysheet_select_save'] = $.extend(
      true,
      [],
      Store.luckysheet_select_save
    )
    file['luckysheet_selection_range'] = $.extend(
      true,
      [],
      Store.luckysheet_selection_range
    )

    if (
      $('#luckysheet-scrollbar-x')[0].scrollWidth >
      $('#luckysheet-scrollbar-x')[0].offsetWidth
    ) {
      file['scrollLeft'] = $('#luckysheet-scrollbar-x').scrollLeft() //横向滚动条
    }

    if (
      $('#luckysheet-scrollbar-y')[0].scrollHeight >
      $('#luckysheet-scrollbar-y')[0].offsetHeight
    ) {
      file['scrollTop'] = $('#luckysheet-scrollbar-y').scrollTop() //纵向滚动条
    }

    file['zoomRatio'] = Store.zoomRatio
  },
  setSheetParam: function(isload = true) {
    let index = this.getSheetIndex(Store.currentSheetIndex)
    let file = Store.luckysheetfile[index]

    Store.flowdata = file['data']
    editor.webWorkerFlowDataCache(Store.flowdata) //worker存数据

    // formula.execFunctionGroupData = null;
    formula.execFunctionGlobalData = null
    window.luckysheet_getcelldata_cache = null

    this.sheetParamRestore(file, Store.flowdata)

    if (file['freezen'] == null) {
      luckysheetFreezen.freezenhorizontaldata = null
      luckysheetFreezen.freezenverticaldata = null
    } else {
      luckysheetFreezen.freezenhorizontaldata =
        file['freezen'].horizontal == null
          ? null
          : file['freezen'].horizontal.freezenhorizontaldata
      luckysheetFreezen.freezenverticaldata =
        file['freezen'].vertical == null
          ? null
          : file['freezen'].vertical.freezenverticaldata
    }

    if (isload) {
      rhchInit(Store.flowdata.length, Store.flowdata[0].length)
    }

    //批注
    luckysheetPostil.buildAllPs(Store.flowdata)

    //图片
    imageCtrl.currentImgId = null
    imageCtrl.images = file.images
    imageCtrl.allImagesShow()
    imageCtrl.init()

    //数据验证
    dataVerificationCtrl.dataVerification = file.dataVerification
    dataVerificationCtrl.init()

    //链接
    hyperlinkCtrl.hyperlink = file.hyperlink
    hyperlinkCtrl.init()

    createFilterOptions(file['filter_select'], file['filter'])
  },
  restoreselect: function() {
    let index = this.getSheetIndex(Store.currentSheetIndex)
    let file = Store.luckysheetfile[index]

    //选区
    selectHightlightShow(true)

    //复制选区虚线框
    selectionCopyShow()

    if (file['scrollLeft'] != null && file['scrollLeft'] > 0) {
      $('#luckysheet-scrollbar-x').scrollLeft(file['scrollLeft']) //列标题
    } else {
      $('#luckysheet-scrollbar-x').scrollLeft(0)
    }

    if (file['scrollTop'] != null && file['scrollTop'] > 0) {
      $('#luckysheet-scrollbar-y').scrollTop(file['scrollTop']) //列标题
    } else {
      $('#luckysheet-scrollbar-y').scrollTop(0)
    }
  },
  storeSheetParamALL: function() {
    let _this = this

    _this.storeSheetParam()
    let index = _this.getSheetIndex(Store.currentSheetIndex)
    Store.luckysheetfile[index]['data'] = Store.flowdata
    Store.luckysheetfile[index]['config'] = $.extend(true, {}, Store.config)
  },
  mergeCalculationSheet: {},
  mergeCalculation: function(index) {
    let file = Store.luckysheetfile[this.getSheetIndex(index)]
    let config = file.config,
      data = file.data
    if (config == null) {
      return
    }
    let mergeConfig = config.merge
    if (
      mergeConfig == null ||
      index in this.mergeCalculationSheet ||
      file['autoCalculationMerge'] === false
    ) {
      return
    }

    this.mergeCalculationSheet[index] = 1

    for (let x in mergeConfig) {
      let r = parseInt(x.substr(0, x.indexOf('_')))
      let c = parseInt(x.substr(x.indexOf('_') + 1))
      let mcInfo = mergeConfig[x]
      if (data[r][c] == null) {
        data[r][c] = {}
      }

      data[r][c]['mc'] = {
        r: r,
        c: c,
        rs: mcInfo.rs,
        cs: mcInfo.cs,
      }

      for (let ir = r; ir < r + mcInfo.rs; ir++) {
        for (let ic = c; ic < c + mcInfo.cs; ic++) {
          if (ir == r && ic == c) {
            continue
          }
          if (data[ir][ic] == null) {
            data[ir][ic] = {}
          }
          data[ir][ic]['mc'] = {
            r: r,
            c: c,
          }
        }
      }
    }
  },
  loadOtherFile: function(file) {
    let _this = this
    // let sheetindexset = _this.checkLoadSheetIndex(file);
    // let sheetindex = [];

    // for(let i = 0; i < sheetindexset.length; i++){
    //     let item = sheetindexset[i];

    //     if(item == file["index"]){
    //         continue;
    //     }

    //     sheetindex.push(item);
    // }

    // for(let i = 0;i<sheetindex.length;i++){
    //     let item = sheetindex[i];
    //     let otherfile = Store.luckysheetfile[_this.getSheetIndex(item)];
    //     if(otherfile["load"] == null || otherfile["load"] == "0"){
    //         otherfile["data"] = _this.buildGridData(otherfile);
    //         otherfile["load"] = "1";
    //     }
    // }

    for (let i = 0; i < Store.luckysheetfile.length; i++) {
      let otherfile = Store.luckysheetfile[i]
      if (otherfile.index == file.index) {
        continue
      }
      // let otherfile = Store.luckysheetfile[_this.getSheetIndex(item)];
      if (otherfile['load'] == null || otherfile['load'] == '0') {
        otherfile['data'] = _this.buildGridData(otherfile)
        otherfile['load'] = '1'
      }
    }
  },
  changeSheet: function(index, isPivotInitial, isNewSheet, isCopySheet) {
    if (isEditMode()) {
      // alert("非编辑模式下不允许该操作！");
      return
    }

    let _this = this

    if (index == Store.currentSheetIndex) {
      return
    }

    if (server.allowUpdate) {
      $('#luckysheet-cell-main #luckysheet-multipleRange-show').empty()
      server.multipleIndex = 0
    }
    let file = Store.luckysheetfile[_this.getSheetIndex(index)]
    // 钩子 sheetCreateAfter
    if (isNewSheet) {
      method.createHookFunction('sheetCreateAfter', { sheet: file })
    }
    // 钩子 sheetCopyAfter
    if (isCopySheet) {
      method.createHookFunction('sheetCopyAfter', { sheet: file })
    }

    // 钩子函数
    method.createHookFunction(
      'sheetActivate',
      index,
      isPivotInitial,
      isNewSheet
    )

    $(
      '#luckysheet-filter-selected-sheet' +
        Store.currentSheetIndex +
        ', #luckysheet-filter-options-sheet' +
        Store.currentSheetIndex
    ).hide()
    $(
      '#luckysheet-filter-selected-sheet' +
        index +
        ', #luckysheet-filter-options-sheet' +
        index
    ).show()

    _this.storeSheetParamALL()
    _this.setCurSheet(index)

    if (!!file.isPivotTable) {
      Store.luckysheetcurrentisPivotTable = true
      if (!isPivotInitial) {
        pivotTable.changePivotTable(index)
      }
    } else {
      Store.luckysheetcurrentisPivotTable = false
      $('#luckysheet-modal-dialog-slider-pivot').hide()
      luckysheetsizeauto(false)
    }

    let load = file['load']
    if (load != null) {
      let data = _this.buildGridData(file)
      file.data = data
      // _this.loadOtherFile(file);

      _this.mergeCalculation(index)
      _this.setSheetParam(true)
      _this.showSheet()

      setTimeout(function() {
        formula.execFunctionGroup()
        luckysheetrefreshgrid()
        server.saveParam('shs', null, Store.currentSheetIndex)
      }, 1)
    } else {
      let loadSheetUrl = server.loadSheetUrl
      if (
        loadSheetUrl == '' ||
        Store.luckysheetcurrentisPivotTable ||
        !!isNewSheet
      ) {
        let data = _this.buildGridData(file)

        file['data'] = data
        file['load'] = '1'

        // *这里不应该调用loadOtherFile去加载其余页面的数据,
        // *因为loadOtherFile里判断后会调用buildGridData把其余的sheet的数据设置为空的二维数组,即使那个sheet在服务端存在数据.
        // *这就导致一个数据丢失问题.
        // _this.loadOtherFile(file);

        // let sheetindexset = _this.checkLoadSheetIndex(file);
        // let sheetindex = [];

        // for(let i = 0; i < sheetindexset.length; i++){
        //     let item = sheetindexset[i];

        //     if(item == file["index"]){
        //         continue;
        //     }

        //     sheetindex.push(item);
        // }

        // for(let i = 0;i<sheetindex.length;i++){
        //     let item = sheetindex[i];
        //     let otherfile = Store.luckysheetfile[_this.getSheetIndex(item)];
        //     if(otherfile["load"] == null || otherfile["load"] == "0"){
        //         otherfile["data"] = _this.buildGridData(otherfile);
        //         otherfile["load"] = "1";
        //     }
        // }

        _this.mergeCalculation(index)
        _this.setSheetParam()
        _this.showSheet()

        setTimeout(function() {
          _this.restoreCache()
          formula.execFunctionGroupForce(
            luckysheetConfigsetting.forceCalculation
          )
          _this.restoreSheetAll(Store.currentSheetIndex)
          luckysheetrefreshgrid()
        }, 1)

        server.saveParam('shs', null, Store.currentSheetIndex)
      } else {
        $('#luckysheet-grid-window-1').append(luckysheetlodingHTML())

        let sheetindex = _this.checkLoadSheetIndex(file)

        $.post(
          loadSheetUrl,
          { gridKey: server.gridKey, index: sheetindex.join(',') },
          function(d) {
            let dataset = new Function('return ' + d)()
            file.celldata = dataset[index.toString()]
            let data = _this.buildGridData(file)

            setTimeout(function() {
              Store.loadingObj.close()
            }, 500)

            for (let item in dataset) {
              if (item == index) {
                continue
              }

              let otherfile = Store.luckysheetfile[_this.getSheetIndex(item)]

              if (otherfile['load'] == null || otherfile['load'] == '0') {
                otherfile.celldata = dataset[item.toString()]
                otherfile['data'] = _this.buildGridData(otherfile)

                otherfile['load'] = '1'
              }
            }

            file['data'] = data
            file['load'] = '1'
            _this.mergeCalculation(index)
            _this.setSheetParam()
            _this.showSheet()

            setTimeout(function() {
              _this.restoreCache()
              formula.execFunctionGroupForce(
                luckysheetConfigsetting.forceCalculation
              )
              _this.restoreSheetAll(Store.currentSheetIndex)
              luckysheetrefreshgrid()
            }, 1)
            server.saveParam('shs', null, Store.currentSheetIndex)
          }
        )
      }
    }

    $('#luckysheet-cell-main .luckysheet-datavisual-selection-set').hide()
    $('#luckysheet-datavisual-selection-set-' + index).show()

    //隐藏其他sheet的图表，显示当前sheet的图表 chartMix
    renderChartShow(index)

    luckysheetFreezen.initialFreezen(index)
    _this.restoreselect()
  },
  checkLoadSheetIndexToDataIndex: {},
  checkLoadSheetIndex: function(file) {
    let calchain = formula.getAllFunctionGroup() //file.calcChain; //index
    let chart = file.chart //dataSheetIndex
    let pivotTable = file.pivotTable //pivotDataSheetIndex

    let ret = [],
      cache = {}

    if (file.index in this.checkLoadSheetIndexToDataIndex) {
      return []
    }

    ret.push(file.index)
    cache[file.index.toString()] = 1
    this.checkLoadSheetIndexToDataIndex[file.index] = 1
    if (calchain != null) {
      let dataIndexList = {}
      for (let i = 0; i < calchain.length; i++) {
        let f = calchain[i]
        let dataindex = f.index
        let formulaTxt = getcellFormula(f.r, f.c, dataindex)

        if (formulaTxt == null) {
          let file = Store.luckysheetfile[this.getSheetIndex(dataindex)]
          file.data = this.buildGridData(file)

          formulaTxt = getcellFormula(f.r, f.c, dataindex)

          if (formulaTxt == null) {
            continue
          }
        }

        if (formulaTxt.indexOf('!') == -1) {
          // dataIndexList[dataindex] = 1;
          formula.addToSheetIndexList(formulaTxt, dataindex)
        } else if (
          formula.formulaContainSheetList != null &&
          formula.formulaContainSheetList[formulaTxt] != null
        ) {
          for (let dataSheetIndex in formula.formulaContainSheetList[
            formulaTxt
          ]) {
            dataIndexList[dataSheetIndex] = 1
          }
        } else {
          formula.functionParser(formulaTxt, (str) => {
            formula.addToCellList(formulaTxt, str)
            if (str.indexOf('!') > -1) {
              let name = str.substr(0, str.indexOf('!'))
              // dataNameList[name] = true;

              let sheet = this.getSheetByName(name)
              if (sheet != null) {
                let dataSheetIndex = sheet.index
                dataIndexList[dataSheetIndex] = 1

                formula.addToSheetIndexList(formulaTxt, dataSheetIndex)
              }
            }
          })

          if (formula.formulaContainSheetList[formulaTxt] == null) {
            // dataIndexList[dataindex] = 1;
            formula.addToSheetIndexList(formulaTxt, dataindex)
          }
        }

        if (dataindex == null) {
          continue
        }

        // if(cache[dataindex.toString()] == null){
        // 	// ret.push(dataindex);
        //     cache[dataindex.toString()] = 1;
        //     this.checkLoadSheetIndexToDataIndex[dataindex] = 1;
        // }
      }

      for (let index in dataIndexList) {
        // let sheet = this.getSheetByName(n);
        // if(sheet==null){
        //     continue;
        // }

        // if(index == Store.currentSheetIndex){
        //     continue;
        // }

        let dataindex = index

        if (cache[dataindex.toString()] == null) {
          ret.push(dataindex)
          cache[dataindex.toString()] = 1
          this.checkLoadSheetIndexToDataIndex[dataindex] = 1
        }
      }
    }

    if (chart != null) {
      for (let i = 0; i < chart.length; i++) {
        let cc = chart[i]
        let dataindex = cc.dataSheetIndex

        if (dataindex == null) {
          continue
        }

        if (cache[dataindex.toString()] == null) {
          ret.push(dataindex)
          cache[dataindex.toString()] = 1
        }
      }
    }

    if (pivotTable != null) {
      let dataindex = pivotTable.pivotDataSheetIndex

      if (dataindex != null && cache[dataindex.toString()] == null) {
        ret.push(dataindex)
        cache[dataindex.toString()] = 1
      }
    }

    return ret
  },
  showSheet: function() {
    // changeSheetContainerSize();
    $('#luckysheet-cell-flow_0').css({ width: Store.ch_width, top: '-1px' }) //width更新
    $('#luckysheet-sheettable_0').css({
      width: Store.ch_width - 1,
      height: Store.rh_height,
    })
    $('#luckysheetrowHeader_0').css('height', Store.rh_height)
    $('#luckysheet-cols-h-cells_0').css('width', Store.ch_width) //width更新

    $('#luckysheet-scrollbar-x div').width(Store.ch_width)
    $('#luckysheet-scrollbar-y div').height(
      Store.rh_height +
        Store.columnHeaderHeight -
        Store.cellMainSrollBarSize -
        3
    )

    //等待滚动条dom宽高计算完成后 初始化该表格滚动位置
    let index = this.getSheetIndex(Store.currentSheetIndex)
    let file = Store.luckysheetfile[index]

    Store.scrollRefreshSwitch = false

    if (file['scrollLeft'] != null && file['scrollLeft'] > 0) {
      $('#luckysheet-scrollbar-x').scrollLeft(
        file['scrollLeft'] * Store.zoomRatio
      )
    } else {
      $('#luckysheet-scrollbar-x').scrollLeft(0)
    }

    if (file['scrollTop'] != null && file['scrollTop'] > 0) {
      $('#luckysheet-scrollbar-y').scrollTop(
        file['scrollTop'] * Store.zoomRatio
      )
    } else {
      $('#luckysheet-scrollbar-y').scrollTop(0)
    }

    setTimeout(() => {
      Store.scrollRefreshSwitch = true
    }, 0)

    zoomNumberDomBind(Store.zoomRatio)
  },
  setCurSheet: function(index) {
    for (let i = 0; i < Store.luckysheetfile.length; i++) {
      if (Store.luckysheetfile[i]['index'] == index) {
        Store.luckysheetfile[i].status = 1
      } else {
        Store.luckysheetfile[i].status = 0
      }
    }

    Store.currentSheetIndex = index
  },
  getSheetIndex: function(index) {
    for (let i = 0; i < Store.luckysheetfile.length; i++) {
      if (Store.luckysheetfile[i]['index'] == index) {
        return i
      }
    }

    return null
  },
  changeSheetExec: function(index, isPivotInitial, isNewSheet, isCopySheet) {
    let $sheet = $('#luckysheet-sheets-item' + index)

    window.luckysheet_getcelldata_cache = null
    $('#luckysheet-sheet-area div.luckysheet-sheets-item').removeClass(
      'luckysheet-sheets-item-active'
    )
    $sheet.addClass('luckysheet-sheets-item-active').show()

    cleargridelement()
    this.changeSheet(index, isPivotInitial, isNewSheet, isCopySheet)

    $('#luckysheet-sheet-list, #luckysheet-rightclick-sheet-menu').hide()

    if (formula.rangestart) {
      formula.createRangeHightlight()
    }

    this.sheetBarShowAndHide(index)
  },
  sheetArrowShowAndHide() {
    const $wrap = $('#luckysheet-sheet-container-c')
    if (!$wrap.length) return
    var sw = $wrap[0].scrollWidth
    var w = Math.ceil($wrap.width())

    if (sw > w) {
      if (luckysheetConfigsetting.showsheetbarConfig.sheet) {
        $('#luckysheet-sheet-area .luckysheet-sheets-scroll').css(
          'display',
          'inline-block'
        )
        $('#luckysheet-sheet-container .docs-sheet-fade-left').show()
      }
    } else {
      $('#luckysheet-sheet-area .luckysheet-sheets-scroll').css(
        'display',
        'none'
      )
      $('#luckysheet-sheet-container .docs-sheet-fade-left').hide()
    }
  },
  // *显示sheet栏左右的灰色
  sheetBarShowAndHide(index) {
    let $c = $('#luckysheet-sheet-container-c')

    if (index != null) {
      let $sheet = $('#luckysheet-sheets-item' + index)
      $c.scrollLeft($sheet.offset().left)
    }

    let c_width = $c.width(),
      c_srollwidth = $c[0].scrollWidth,
      scrollLeft = $c.scrollLeft()

    if (scrollLeft <= 0) {
      $('#luckysheet-sheet-container .docs-sheet-fade-left').hide()
    } else {
      $('#luckysheet-sheet-container .docs-sheet-fade-left').show()
    }

    if (c_width + scrollLeft >= c_srollwidth) {
      $('#luckysheet-sheet-container .docs-sheet-fade-right').hide()
    } else {
      $('#luckysheet-sheet-container .docs-sheet-fade-right').show()
    }
  },
  delChart: function(chart_id, sheetIndex) {
    let index = this.getSheetIndex(sheetIndex)
    let file = Store.luckysheetfile[index]

    if (file.chart == null) {
      file.chart = []
    } else {
      for (let i = 0; i < file.chart.length; i++) {
        if (file.chart[i].chart_id == chart_id) {
          Store.luckysheetfile[index].chart.splice(i, 1)
          break
        }
      }
    }
  },
  saveChart: function(json) {
    //采用chartMix store存储，弃用Store.luckysheetfile存储，防止重复存储
    let index = this.getSheetIndex(json.sheetIndex)
    let file = Store.luckysheetfile[index]

    if (file.chart == null) {
      file.chart = []
      file.chart.push(json)
    } else {
      for (let i = 0; i < file.chart.length; i++) {
        if (file.chart[i].chart_id == json.chart_id) {
          let old = $.extend(true, {}, file.chart[i])
          file.chart[i] = $.extend(true, {}, old, json)
          return
        }
      }

      file.chart.push(json)
    }
  },
  getChart: function(sheetIndex, chart_id) {
    let index = this.getSheetIndex(sheetIndex)
    let file = Store.luckysheetfile[index]

    if (file.chart == null) {
      return null
    } else {
      for (let i = 0; i < file.chart.length; i++) {
        if (file.chart[i].chart_id == chart_id) {
          return file.chart[i]
        }
      }

      return null
    }
  },
  getRangetxt: function(sheetIndex, range, currentIndex) {
    let sheettxt = ''

    if (currentIndex == null) {
      currentIndex = Store.currentSheetIndex
    }

    if (sheetIndex != currentIndex) {
      sheettxt = Store.luckysheetfile[this.getSheetIndex(sheetIndex)].name + '!'
    }

    let row0 = range['row'][0],
      row1 = range['row'][1]
    let column0 = range['column'][0],
      column1 = range['column'][1]

    if (row0 == null && row1 == null) {
      return sheettxt + chatatABC(column0) + ':' + chatatABC(column1)
    } else if (column0 == null && column1 == null) {
      return sheettxt + (row0 + 1) + ':' + (row1 + 1)
    } else {
      if (column0 == column1 && row0 == row1) {
        return sheettxt + chatatABC(column0) + (row0 + 1)
      } else {
        return (
          sheettxt +
          chatatABC(column0) +
          (row0 + 1) +
          ':' +
          chatatABC(column1) +
          (row1 + 1)
        )
      }
    }
  },
  getSheetName: function(sheetIndex) {
    if (sheetIndex == null) {
      sheetIndex = Store.currentSheetIndex
    }

    return Store.luckysheetfile[this.getSheetIndex(sheetIndex)].name
  },
  getSheetMerge: function() {
    if (Store.config.merge == null) {
      return null
    }

    return Store.config.merge
  },
  getSheetData: function(sheetIndex) {
    if (sheetIndex == null) {
      sheetIndex = Store.currentSheetIndex
    }

    return Store.luckysheetfile[this.getSheetIndex(sheetIndex)].data
  },
  getSheetConfig: function(sheetIndex) {
    let _this = this

    if (sheetIndex == null) {
      sheetIndex = Store.currentSheetIndex
    }

    let config = Store.luckysheetfile[_this.getSheetIndex(sheetIndex)].config

    if (config == null) {
      Store.luckysheetfile[_this.getSheetIndex(sheetIndex)].config = {}
    }

    return Store.luckysheetfile[_this.getSheetIndex(sheetIndex)].config
  },
  restoreFilter: function(sheetIndex) {
    let index = this.getSheetIndex(sheetIndex)
    let file = Store.luckysheetfile[index]

    // if($('#luckysheet-filter-selected-sheet' + sheetIndex).length > 0 || file.filter_select == null || JSON.stringify(file.filter_select) == "{}"){
    //     if(file.config != null && file.config.rowhidden != null){
    //         file.config.rowhidden =  {};
    //         Store.config = file.config;

    //         jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length,false);
    //     }

    //     return;
    // }

    if (getObjType(file.filter_select) == 'string') {
      file.filter_select = JSON.parse(file.filter_select)
    }

    if (
      file.filter_select == null ||
      file.filter_select.row == null ||
      file.filter_select.column == null
    ) {
      return
    }

    createFilterOptions(file.filter_select)

    if (getObjType(file.filter) != 'object') {
      if (file.filter != null && getObjType(file.filter) == 'string') {
        file.filter = JSON.parse(file.filter)
      }
    }

    let rowhidden = {}
    if (file.config != null && file.config.rowhidden != null) {
      rowhidden = file.config.rowhidden
    }

    $(
      '#luckysheet-filter-options-sheet' +
        sheetIndex +
        ' .luckysheet-filter-options'
    ).each(function(i) {
      if (file.filter == null) {
        return false
      }

      let $top = $(this)
      let item = file.filter[i]

      if (item == null) {
        return true
      }

      if (getObjType(item) != 'object') {
        item = JSON.parse(item)
      }

      labelFilterOptionState(
        $top,
        item.optionstate,
        item.rowhidden,
        item.caljs,
        false,
        item.st_r,
        item.ed_r,
        item.cindex,
        item.st_c,
        item.ed_c
      )

      rowhidden = $.extend(true, rowhidden, item.rowhidden)
    })

    if (file.config == null) {
      file.config = {}
    }

    file.config['rowhidden'] = rowhidden
    Store.config = file.config

    jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length, false)
  },
  restorePivot: function(sheetIndex) {
    let index = this.getSheetIndex(sheetIndex)
    let file = Store.luckysheetfile[index]

    if (!file.isPivotTable) {
      return
    }

    pivotTable.getCellData(sheetIndex)
    pivotTable.initialPivotManage(true)
    pivotTable.refreshPivotTable(false)
  },
  restoreSheetAll: function(sheetIndex) {
    let _this = this
    _this.restorePivot(sheetIndex)
    _this.restoreFilter(sheetIndex)
    _this.restoreFreezen(sheetIndex)
  },
  restoreFreezen: function(sheetIndex) {
    luckysheetFreezen.initialFreezen(sheetIndex)
  },
  restoreCache: function() {
    let _this = this

    let data = _this.CacheNotLoadControll
    _this.CacheNotLoadControll = []

    if (data.length == 0) {
      return
    }

    for (let i = 0; i < data.length; i++) {
      let item = data[i]
      _this.execCache(item)
    }
  },
  CacheNotLoadControll: [],
  execCache: function(item) {
    let _this = this

    let type = item.t
    let index = item.i
    let value = item.v
    let file = Store.luckysheetfile[_this.getSheetIndex(index)]

    if (type == 'sha') {
      Store.luckysheetfile.push(value)
    } else if (type == 'shc') {
      let copyjson = $.extend(
        true,
        {},
        Store.luckysheetfile[_this.getSheetIndex(value.copyindex)]
      )
      copyjson.index = index
      Store.luckysheetfile.push(copyjson)
    } else if (type == 'shd') {
      Store.luckysheetfile.splice(value.deleIndex, 1)
    } else if (type == 'shr') {
      for (let pos in value) {
        Store.luckysheetfile[_this.getSheetIndex(pos)].order = value[pos]
      }
    }

    if (
      (file == null || file.load != '1') &&
      !(type in { sha: 0, shc: 0, shd: 0, shr: 0 })
    ) {
      _this.CacheNotLoadControll.push(item)
      return
    }

    if (type == 'v') {
      let r = item.r,
        c = item.c,
        v = item.v
      let data = _this.getSheetData(index)
      file.data[r][c] = v
    } else if (type == 'fc') {
      let op = item.op,
        pos = item.pos

      if (getObjType(value) != 'object') {
        value = new Function('return ' + value)()
      }

      let r = value.r,
        c = value.c

      if (op == 'del') {
        formula.delFunctionGroup(r, c, index)
      } else {
        formula.insertUpdateFunctionGroup(r, c, index)
      }
    } else if (type == 'cg') {
      let v = value,
        k = item.k
      let config1 = _this.getSheetConfig(index)

      if (!(k in config1)) {
        config1[k] = {}
      }

      for (let key in v) {
        config1[k][key] = v[key]
      }

      Store.config = config1
    } else if (type == 'f') {
      let v = value,
        op = item.op,
        pos = item.pos
      let filter = file.filter

      if (filter == null) {
        filter = {}
      }

      if (op == 'upOrAdd') {
        filter[pos] = v
      } else if (op == 'del') {
        delete filter[pos]
      }
    } else if (type == 'fsc') {
      file.filter = null
      file.filter_select = null
    } else if (type == 'fsr') {
      let v = value
      file.filter = v.filter
      file.filter_select = v.filter_select
    } else if (type == 'sh') {
      let op = item.op,
        cur = item.cur,
        v = value
      if (op == 'hide') {
        file.status = 0
        Store.luckysheetfile[_this.getSheetIndex(cur)].status = 1
      } else if (op == 'show') {
        for (let i = 0; i < Store.luckysheetfile.length; i++) {
          Store.luckysheetfile[i].status = 0
        }
        file.status = 1
      }
    } else if (type == 'all') {
      let k = item.k,
        s = item.s
      if (s && getObjType(value) != 'object') {
        file[k] = JSON.stringify(value)
      } else {
        file[k] = value
      }
    } else if (type == 'c') {
      let op = item.op,
        cid = item.cid

      if (op == 'add') {
        file.chart.push(value)
      } else if (op == 'xy' || op == 'wh' || op == 'update') {
        for (let i = 0; i < file.chart.length; i++) {
          if (file.chart[i].chart_id == cid) {
            for (let item in file.chart[i]) {
              for (let vitem in value) {
                if (item == vitem) {
                  file.chart[i][item] = value[vitem]
                }
              }
            }
            return
          }
        }
      } else if (op == 'del') {
        for (let i = 0; i < file.chart.length; i++) {
          if (file.chart[i].chart_id == cid) {
            file.chart.splice(i, 1)
            return
          }
        }
      }
    } else if (type == 'drc') {
      let rc = item.rc,
        index = value.index,
        len = value.len
      let celldata = file.celldata

      if (rc == 'r') {
        for (let i = 0; celldata.length == 0; i++) {
          let cell = celldata[i]
          if (cell.r >= index && cell.r < index + len) {
            delete celldata[i]
          } else if (cell.r >= index + len) {
            cell.r -= len
          }
        }

        file.row -= len
      } else {
        for (let i = 0; celldata.length == 0; i++) {
          let cell = celldata[i]
          if (cell.c >= index && cell.c < index + len) {
            delete celldata[i]
          } else if (cell.c >= index + len) {
            cell.c -= len
          }
        }

        file.column -= len
      }

      let ret = []
      for (let i = 0; i < celldata.length; i++) {
        if (celldata[i] != null) {
          ret.push(celldata[i])
        }
      }
      file.celldata = ret

      let mtype, mst, med
      if (rc == 'r') {
        mtype = 'row'
      } else {
        mtype = 'column'
      }
      mst = index
      med = index + len - 1

      luckysheetdeletetable(mtype, mst, med, true)
    } else if (type == 'arc') {
      let rc = item.rc,
        index = value.index,
        len = value.len
      let celldata = file.celldata

      if (rc == 'r') {
        for (let i = 0; i < celldata.length; i++) {
          let cell = celldata[i]
          if (cell.r > index) {
            cell.r += len
          }
        }

        file.row += len
      } else {
        for (let i = 0; i < celldata.length; i++) {
          let cell = celldata[i]
          if (cell.c > index) {
            cell.c += len
          }
        }

        file.column += len
      }

      let mtype
      if (rc == 'r') {
        mtype = 'row'
      } else {
        mtype = 'column'
      }

      luckysheetextendtable(mtype, index, len, true)
    } else if (type == 'na') {
      server.saveParam('na', null, value)
    } else if (type == 'thumb') {
      setTimeout(function() {
        _this.imageRequest()
      }, 2000)
    }
  },
}

export default sheetmanage
